ServiceManager是Android系统的服务大管家,它负责所有实名Server的管理,比如CameraService,WindowManagerService等等,所以它的重要性可想而知,ServiceManager是单独运行在一个系统进程中的,它在Init.rc的定义如下:
1 | service servicemanager /system/bin/servicemanager |
Class 为core 属于核心级的 它的主方法在service_manager.c中定义 我们看看它的实现:
1 | frameworks/native/cmds/servicemanager/service_manager.c |
进入主方法后,主要做了三件事:
<1>. 打开binder驱动设备,servicemanager的业务并不复杂,这里映射的大小为128k。
<2>. 调用binder_become_context_manager使sevicemanger成为所有实名服务的大管家
<3>. 调用binder_loop进入binder循环,等待client端的请求。svcmgr_handler为servicemanager服务处理handler,它是一个函数指针,主要是处理它自身的业务逻辑。比如我们的client端通过AddService或者getService的服务就是在这里进行处理的。
下面我们分析servicemanager的binder_loop
1 | frameworks/native/cmds/servicemanager/binder.c |
Binder_loop中首先通过binder_write向Binder驱动写入BC_ENTER_LOOPER,表示进入binder循环,然后通过BINDER_WRITE_READ读取binder内容,结果存放在一个binder_write_read结构中,然后开始通过binder_parse解析数据,这里将我们的服务处理函数传递给它,那么数据应该是在这里交给我们的handler进行处理。
1 | frameworks/native/cmds/servicemanager/binder.c |
可以看到在BR_TRANSACTION中的确是通过fun,也就是svcmgr_handler进行处理的。
1 | //sm的服务handler |
Servicemanager作为服务的大管家它的业务并不负责,相比其他service的服务可以说是异常简单,我们看看它最重要的服务即添加服务和获取服务。
Servicemanager维护了一个svclist链表,每个添加进来的服务都会通过一个svcinfo进行描述,并添加到链表中。它的结构如下
1 | struct svcinfo |
我们看看查找服务的过程
1 | void *do_find_service(struct binder_state *bs, uint16_t *s, unsigned len, unsigned uid) |
很简单,它在内部遍历链表,根据服务名进行查找如果找到返回对应的句柄si->ptr,否则返回0.
而添加服务的方法为do_add_service,它的实现如下
1 | frameworks/native/cmds/servicemanager/service_manager.c |
添加服务的名称长度不能大于127,随后在svclist中查找服务是否已经存在,如果存在,则释放之前的服务实例,将最新的服务句柄赋值给ptr,否则服务不存在,就需要为新的服务创建svcinfo结构,并对其进行初始化。同时将其添加到svclist的头部。